﻿using System;
using System.Configuration;
using System.Globalization;
using System.Text;
using System.Threading;
using System.Web.UI;
using System.Web.UI.WebControls;
using ClickLand.Web.UI.WebControls;

/// <summary> Control para el manejo de las consultas con el rango de fechas </summary>
public partial class ControlesComunes_RangoFechas : UserControl
{
    #region Propiedades

    /// <summary> Propiedad que permite obtener o cargar el valor
    /// si se desea validar los dias laborales o no </summary>
    public bool ValidarDiasLaborables
    {
        get
        {
            if (ViewState["ValidarDiasLaborables"] == null)
                return false;
            else
                return (bool)ViewState["ValidarDiasLaborables"];
        }
        set
        {
            ViewState["ValidarDiasLaborables"] = value;
        }
    }


    /// <summary> Propiedad que permite obtener o cargar el mensaje
    /// de error cuando el rango de fechas es inválido </summary>
    public string MsjErrRangoFechas
    {
        get
        {
            if (ViewState["MsjErrRangoFechas"] == null)
                return "Error rango de fecha";
            else
                return (string)ViewState["MsjErrRangoFechas"];
        }
        set
        {
            ViewState["MsjErrRangoFechas"] = value;
        }
    }


    /// <summary> Propiedad que permite obtener o cargar el nombre del
    /// key en el Web.config qe tiene el rango máximo para las fechas </summary>
    public string NombreKeyRangoFechas
    {
        get
        {
            return (string)ViewState["ConfigKeyRangoFechas"];
        }
        set
        {
            ViewState["ConfigKeyRangoFechas"] = value;
        }
    }

    

    /// <summary>Propiedad que devuelve el calendario de la fecha de inicio.</summary>
    public DateTime FechaDesde
    {
        get { return Convert.ToDateTime(dtFechaDesde.Text); }
        set { dtFechaDesde.Text = value.ToString("dd/MM/yyyy"); }
    }


    /// <summary>Propiedad que devuelve el calendario de la fecha de fin.</summary>
    public DateTime FechaHasta
    {
        get { return Convert.ToDateTime(dtFechaHasta.Text); }
        set { dtFechaHasta.Text = value.ToString("dd/MM/yyyy"); }
    }


    /// <summary> Propiedad que permite obtener la instancia
    /// del objeto del dropDownlist de períodos </summary>
    public ClickLandDropDownList Del
    {
        get { return ddlPeriodo; }
    }


    /// <summary> Propiedad que permite obtener la instancia del objeto
    /// del RadioButton de la opción 'Por período' </summary>
    public ClickLandRadioButton RbPeriodo
    {
        get { return rdoPeriodo; }
    }


    /// <summary> Propiedad que permite obtener la instancia del objeto
    /// del RadioButton de la opción 'Por rango' </summary>
    public ClickLandRadioButton RbRango
    {
        get { return rdoRango; }
    }


    /// <summary>Propiedad que establece el periodo que por defecto se mostrará.</summary>
    public string InicioPeriodo
    {
        get { return (string)ViewState["InicioPeriodo"]; }
        set
        {
            ViewState["InicioPeriodo"] = value;
        }
    }


    /// <summary>Propiedad q Indica que no se debe tomar en cuenta el día de hoy.</summary>
    public bool NoToday
    {
        get
        {
            if (ViewState["NoToday"] == null)
                return false;
            else
                return (bool)ViewState["NoToday"];
        }
        set
        {
            ViewState["NoToday"] = value;
        }
    }


    /// <summary> Propiedad que permite obtener o cargar el valor
    /// del rango máximo de fechas </summary>
    public int? RangoFecha
    {
        get
        {
            return 365;
        }
        set
        {
            ViewState["RangoFecha"] = value;
        }
    }
    

    /// <summary>Retorna la minima fecha permitida para obtener los movimientos de cuenta.</summary>
    /// <returns>Objeto DateTime con la fecha.</returns>
    /// <remarks>La fechas no deben ser menores al 1 de enero del anño anterior.</remarks>
    public DateTime GetMinimumDateAllowed()
    {
        return new DateTime(DateTime.Now.Year - 3, 1, 1);
    }


    /// <summary>Retorna la máxima fecha que se puede permitir en una consulta de movimientos de cuenta.</summary>
    /// <returns>Objeto DateTime con la fecha.</returns>
    /// <remarks>La fechas no deben ser mayores de la fecha actual.</remarks>
    public DateTime GetMaximumDateAllowed()
    {
        return DateTime.Now;
    }


    /// <summary>
    /// Método que inicia los valores de los controles
    /// de Control de usuario
    /// </summary>
    public void InicializarControles()
    {
        rdoPeriodo.Checked = true;
        rdoRango.Checked = false;
        CargarPeriodo();
    }
    #endregion

    #region Eventos

    /// <summary> Evento que se ejecuta al inicializar la página </summary>
    /// <param name="sender">Referencia al objeto que provocó el evento</param>
    /// <param name="e">Argumento del evento</param>
    protected void Page_Init(object sender, EventArgs e)
    {
        TrackViewState();

        //rvFechaDesde.ErrorMessage = string.Format("La fecha mínima permitida es {0}", FechaMinimaPermitida.ToShortDateString());
        //rvFechaHasta.ErrorMessage = string.Format("La fecha máxima permitida es {0}", FechaMaximaPermitida.ToShortDateString());


        CustomValidatorFechas.ClientValidationFunction = string.Format("ValidarRango('{0}', '{1}');", dtFechaDesde.ClientID, dtFechaHasta.ClientID);

        if (!IsPostBack)
        {
            CargarRangoFecha();

            CustomValidatorFechas.ErrorMessage = MsjErrRangoFechas;

            dtFechaDesde.Enabled = false;
            dtFechaHasta.Enabled = false;
            InicializarControles();
            CrearScriptCliente();
            InicializarCalendarios();
        }
    }


    /// <summary> Evento que se ejecuta al cargar la página </summary>
    /// <param name="sender">Referencia al objeto que causó el evento</param>
    /// <param name="e">Argumento del evento</param>
    protected void Page_Load(object sender, EventArgs e)
    {
        CrearScriptCliente();

        if (rdoPeriodo.Checked)
        {
            ddlPeriodo.Enabled = true;
            dtFechaDesde.Enabled = false;
            dtFechaHasta.Enabled = false;
            InicializarCalendarios();
        }
        else if (rdoRango.Checked)
        {
            ddlPeriodo.Enabled = false;
            dtFechaDesde.Enabled = true;
            dtFechaHasta.Enabled = true;
        }

    }


    /// <summary> Método que carga el rango máximo de fechas </summary>
    private void CargarRangoFecha()
    {
        if (RangoFecha == null)
        {
            RangoFecha = 365;
        }
    }

    public string Periodo
    {
        get { return ddlPeriodo.SelectedItem.Text; }
    }

    #endregion


    /// <summary>Adicional una referencia a un archivo js.</summary>
    /// <param name="csname">Nombre del registro.</param>
    /// <param name="sUrl">Dirección en disco relativa al site.</param>
    protected void AgregarJs(string csname, string sUrl)
    {
        string csurl = ResolveUrl(sUrl);
        Type cstype = GetType();
        ClientScriptManager cs = Page.ClientScript;
        if (!cs.IsClientScriptIncludeRegistered(cstype, csname))
            cs.RegisterClientScriptInclude(cstype, csname, csurl);
    }


    /// <summary>Retorna la fecha que se corresponde a los key de Periodo.</summary>
    /// <param name="key">Nombre de la clave en archivo de recurso para la fecha precisa.</param>
    /// <param name="noToday">Indica que no se debe tomar en cuenta el día de hoy.</param>
    /// <param name="workDay">Indica que se debe incluir el último día hábil posterior al rango.</param>
    /// <remarks>Esto permite que los rangos de fechas a validar se puedan configurar en cada combo basado en datos en el archivo de configuración.</remarks>
    protected DateTime[] ObtenerFechaPorKeyPeriodo(string key, bool noToday, bool workDay)
    {
        switch (key)
        {
            case @"PeriodoDiaAnterior":
                return new DateTime[2] { DateTime.Today.AddDays(-1), DateTime.Today.AddDays(-1) };
            case @"PeriodoMes":
                if (noToday)
                    return new DateTime[2] { DateTime.Today.AddDays(1 - DateTime.Now.Day), DateTime.Today.AddDays(-1) };
                if (workDay)
                    return new DateTime[2] { DateTime.Today.AddDays(1 - DateTime.Now.Day), GetNextWorkDay(DateTime.Today) };
                return new DateTime[2] { DateTime.Today.AddDays(1 - DateTime.Now.Day), DateTime.Today };
            case @"PeriodoMesAnterior":
                DateTime tm = DateTime.Today.AddDays(-DateTime.Now.Day);
                if (workDay)
                    return new DateTime[2] { tm.AddDays(1 - tm.Day), GetNextWorkDay(tm) };
                return new DateTime[2] { tm.AddDays(1 - tm.Day), tm };
            case @"PeriodoTodoMes":
                DateTime tmPTM = DateTime.Today.AddDays(1 - DateTime.Now.Day);
                if (workDay)
                    return new DateTime[2] { tmPTM, GetNextWorkDay(tmPTM.AddMonths(1).AddDays(-1)) };
                return new DateTime[2] { tmPTM, tmPTM.AddMonths(1).AddDays(-1) };
            case @"PeriodoUltimaSemana":
                if (noToday)
                    return new DateTime[2] { DateTime.Today.AddDays(-7), DateTime.Today.AddDays(-1) };
                if (workDay)
                    return new DateTime[2] { DateTime.Today.AddDays(-7), GetNextWorkDay(DateTime.Today) };
                return new DateTime[2] { DateTime.Today.AddDays(-7), DateTime.Today };
            case @"PeriodoUltimosQuinceDias":
                if (noToday)
                    return new DateTime[2] { DateTime.Today.AddDays(-15), DateTime.Today.AddDays(-1) };
                if (workDay)
                    return new DateTime[2] { DateTime.Today.AddDays(-15), GetNextWorkDay(DateTime.Today) };
                return new DateTime[2] { DateTime.Today.AddDays(-15), DateTime.Today };
            case @"PeriodoUltimosTresMeses":
                if (noToday)
                    return new DateTime[2] { DateTime.Today.AddMonths(-3), DateTime.Today.AddDays(-1) };
                if (workDay)
                    return new DateTime[2] { DateTime.Today.AddMonths(-3), GetNextWorkDay(DateTime.Today) };
                return new DateTime[2] { DateTime.Today.AddMonths(-3), DateTime.Today };
            case @"PeriodoUltimosSeisMeses":
                if (noToday)
                    return new DateTime[2] { DateTime.Today.AddMonths(-6), DateTime.Today.AddDays(-1) };
                if (workDay)
                    return new DateTime[2] { DateTime.Today.AddMonths(-6), GetNextWorkDay(DateTime.Today) };
                return new DateTime[2] { DateTime.Today.AddMonths(-6), DateTime.Today };
            case @"PeriodoUltimoAño":
                if (noToday)
                    return new DateTime[2] { new DateTime(DateTime.Today.Year, 1, 1), DateTime.Today.AddDays(-1) };
                if (workDay)
                    return new DateTime[2] { new DateTime(DateTime.Today.Year, 1, 1), GetNextWorkDay(DateTime.Today) };
                return new DateTime[2] { new DateTime(DateTime.Today.Year, 1, 1), DateTime.Today };
            case @"PeriodoDia":
                if (noToday)
                    return new DateTime[2] { DateTime.Today, DateTime.Today.AddDays(-1) };
                if (workDay)
                    return new DateTime[2] { DateTime.Today, GetNextWorkDay(DateTime.Today) };
                return new DateTime[2] { DateTime.Today, DateTime.Today };
            default:
                return new DateTime[2] { DateTime.MinValue, DateTime.MinValue };
        }
    }


    /// <summary>Permite obtener la fecha siguiente hábil considerando los días de semana, los feriados y bancarios.</summary>
    /// <param name="fecha">Fecha a partir de la cual buscar.</param>
    /// <returns>Fecha siguiente hábil.</returns>
    /// <remarks>Utiliza los key "Feriados" y "Bancarios" para reconocer los feriados y los días bancarios, por lo que es importante tener actualizados los dos últimos años en estos keys.</remarks>
    protected DateTime GetNextWorkDay(DateTime fecha)
    {
        //IFormatProvider provider = Thread.CurrentThread.CurrentCulture;
        Thread.CurrentThread.CurrentCulture = new CultureInfo("es-VE");
        IFormatProvider provider = Thread.CurrentThread.CurrentCulture;
        string[] Bancarios = ConfigurationManager.AppSettings[@"Bancarios"].Split(',');
        string[] Feriados = ConfigurationManager.AppSettings[@"Feriados"].Split(',');
        DateTime fecha1 = DateTime.MinValue;
        while (fecha1 != fecha)
        {
            fecha1 = fecha;
            if (fecha.DayOfWeek == DayOfWeek.Saturday)
                fecha = fecha.AddDays(2);
            else if (fecha.DayOfWeek == DayOfWeek.Sunday)
                fecha = fecha.AddDays(1);
            for (int j = 0; j < Bancarios.Length; j++)
                if (fecha.CompareTo(DateTime.Parse(Bancarios[j], provider)) == 0)
                {
                    fecha = fecha.AddDays(1);
                    break;
                }
            for (int j = 0; j < Feriados.Length; j++)
                if (fecha.CompareTo(DateTime.Parse(Feriados[j], provider)) == 0)
                {
                    fecha = fecha.AddDays(1);
                    break;
                }
        }
        return fecha;
    }


    /// <summary>Carga un DrowDownList con un periodo definido en el archivo de configuración.</summary>
    /// <param name="ddlPeriodo">DrowDownList a cargar.</param>
    /// <param name="configName">Nombre del key en el archivo de configuración.</param>
    /// <param name="limpiar">Si se debe limpiar el DrowDownList antes de llenarlo.</param>
    /// <remarks>Entiende los mismos key de ObtenerFechaPorKey.</remarks>
    protected void CargarPeriodo()
    {
        //Obtiene datos del archivo de configuració y los separa por el ;
        string[] sList = ConfigurationManager.AppSettings["PeriodoCalendario"].Split(';');
        //Llena el dropdownlist con los pares [key][Texto en Recursos]
        ddlPeriodo.Items.Clear();
        foreach (string periodo in sList)
            ddlPeriodo.Items.Add(new ListItem(periodo.Split('|')[0],periodo.Split('|')[1]));
    }

    
    /// <summary>
    /// Metodo que inicializa los controles relacionados
    /// con las opciones de fecha en la vista basica.
    /// </summary>
    private void InicializarCalendarios()
    {
        DateTime[] rango = ObtenerFechaPorKeyPeriodo(ddlPeriodo.SelectedValue, NoToday, ValidarDiasLaborables);
        dtFechaHasta.Text = rango[1].ToShortDateString();
        dtFechaDesde.Text = rango[0].ToShortDateString();
        //FechaMinimaPermitida = rango[0];
    }


    /// <summary>
    /// Metodo que carga los scripts necesarios
    /// para la ejecucion de la vista basica.
    /// </summary>
    private void CrearScriptCliente()
    {
        string scriptEvento = string.Format
            (@"ActivarValidarFechas( '{0}', '{1}', '{2}', '{3}','{4}','{5}' );",
            rdoRango.ClientID, dtFechaDesde.ClientID,
            dtFechaHasta.ClientID, ddlPeriodo.ClientID, Image3.ClientID,Image4.ClientID);

        rdoRango.Attributes.Add(@"onClick", scriptEvento);
        rdoPeriodo.Attributes.Add(@"onClick", scriptEvento);
        ddlPeriodo.Attributes.Add(@"onchange", scriptEvento);

        if (!Page.ClientScript.IsClientScriptBlockRegistered(Page.GetType(), @"AVF"))
        {
            StringBuilder sScript = new StringBuilder();
            sScript.Append("<script language=\"javascript\" type=\"text/javascript\">\n");
            sScript.Append("function ActivarValidarFechas( idRdoRango, idDtFechaDesde, idDtFechaHasta, idDdlPeriodo,btnInicio,btnHasta )\n");
            sScript.Append("{\n");
            sScript.Append("var chkOption = document.getElementById(idRdoRango);\n");
            sScript.Append("var vdtFechaDesde = document.getElementById(idDtFechaDesde);\n");
            sScript.Append("var vdtFechaHasta = document.getElementById(idDtFechaHasta);\n");
            sScript.Append("var vdtFechaDesdebtn = document.getElementById(btnInicio);\n");
            sScript.Append("var vdtFechaHastabtn = document.getElementById(btnHasta);\n");
            sScript.Append("var vdllPeriodo = document.getElementById(idDdlPeriodo);\n");

            sScript.Append("if(chkOption)\n");
            sScript.Append("{\n");
            sScript.Append("vdllPeriodo.disabled = chkOption.checked;\n");
            sScript.Append("if(!chkOption.checked)\n");
            sScript.Append("{\n");
            sScript.Append("switch(vdllPeriodo.value)\n");
            sScript.Append("{\n");
            for (int i = 0; i < ddlPeriodo.Items.Count; i++)
            {
                DateTime[] Rangos = ObtenerFechaPorKeyPeriodo(ddlPeriodo.Items[i].Value, NoToday, ValidarDiasLaborables);
                sScript.AppendFormat("case '{0}': vdtFechaDesde.value = '{1}'; vdtFechaHasta.value = '{2}'; break;\n", ddlPeriodo.Items[i].Value, Rangos[0].ToShortDateString(), Rangos[1].ToShortDateString());
            }
            sScript.Append("}\n");
            sScript.Append("}\n");
            sScript.Append("}\n");
            sScript.Append("vdtFechaDesde.disabled = vdtFechaHasta.disabled = !chkOption.checked;\n");
            sScript.Append("vdtFechaDesdebtn.style.visibility = !chkOption.checked ? 'hidden':'visible';\n");
            sScript.Append("vdtFechaHastabtn.style.visibility = !chkOption.checked ? 'hidden':'visible';\n");
            sScript.Append("}\n");
            sScript.Append("</script>\n");
            Page.ClientScript.RegisterClientScriptBlock(Page.GetType(), @"AVF", sScript.ToString());
        }

        if ((RangoFecha > 0)
            && (!Page.ClientScript.IsClientScriptBlockRegistered(Page.GetType(), @"ValRango")))
        {

            CultureInfo provider = Thread.CurrentThread.CurrentCulture;
            StringBuilder sScript = new StringBuilder();

            sScript.Append("<script language=\"javascript\" type=\"text/javascript\">\n");
            sScript.Append("function ValidarRango(IDdtFechaDesde, IDdtFechaHasta)\n");
            sScript.Append("{\n");
            sScript.Append("var vFechaDesde = document.getElementById(IDdtFechaDesde).value;\n");
            sScript.Append("var vFechaHasta = document.getElementById(IDdtFechaHasta).value;\n");
            sScript.Append("if(vFechaDesde && vFechaDesde.length > 0 && vFechaHasta && vFechaHasta.length > 0)\n");
            sScript.Append("{\n");
            sScript.AppendFormat("var aFechaDesde = vFechaDesde.split('{0}');\n", provider.DateTimeFormat.DateSeparator);
            sScript.AppendFormat("var aFechaHasta = vFechaHasta.split('{0}');\n", provider.DateTimeFormat.DateSeparator);
            string sformat = provider.DateTimeFormat.ShortDatePattern;

            if (sformat == @"dd" + provider.DateTimeFormat.DateSeparator + @"MM" + provider.DateTimeFormat.DateSeparator + @"yyyy")
                sScript.Append("var vFD = new Date(Number(aFechaDesde[2]), Number(aFechaDesde[1]) - 1, Number(aFechaDesde[0]));\n");
            else if (sformat == @"MM" + provider.DateTimeFormat.DateSeparator + @"dd" + provider.DateTimeFormat.DateSeparator + @"yyyy")
                sScript.Append("var vFD = new Date(Number(aFechaDesde[2]), Number(aFechaDesde[0]) - 1, Number(aFechaDesde[1]));\n");
            else if (sformat == @"yyyy" + provider.DateTimeFormat.DateSeparator + @"MM" + provider.DateTimeFormat.DateSeparator + "dd")
                sScript.Append("var vFD = new Date(Number(aFechaDesde[0]), Number(aFechaDesde[1]) - 1, Number(aFechaDesde[2]));\n");
            else
                sScript.Append("var vFD = new Date(Number(aFechaDesde[2]), Number(aFechaDesde[0]) - 1, Number(aFechaDesde[1]));\n");
            if (sformat == @"dd" + provider.DateTimeFormat.DateSeparator + @"MM" + provider.DateTimeFormat.DateSeparator + @"yyyy")
                sScript.Append("var vFH = new Date(Number(aFechaHasta[2]), Number(aFechaHasta[1]) - 1, Number(aFechaHasta[0]));\n");
            else if (sformat == @"MM" + provider.DateTimeFormat.DateSeparator + @"dd" + provider.DateTimeFormat.DateSeparator + @"yyyy")
                sScript.Append("var vFH = new Date(Number(aFechaHasta[2]), Number(aFechaHasta[0]) - 1, Number(aFechaHasta[1]));\n");
            else if (sformat == @"yyyy" + provider.DateTimeFormat.DateSeparator + @"MM" + provider.DateTimeFormat.DateSeparator + "dd")
                sScript.Append("var vFH = new Date(Number(aFechaHasta[0]), Number(aFechaHasta[1]) - 1, Number(aFechaHasta[2]));\n");
            else
                sScript.Append("vFH = new Date(Number(aFechaHasta[2]), Number(aFechaHasta[0]) - 1, Number(aFechaHasta[1]));\n");
            sScript.Append("var ONE_DAY = 1000 * 60 * 60 * 24\n");
            sScript.Append("var difference_ms = Math.abs(vFH.getTime() - vFD.getTime());\n");
            sScript.Append("var diferencia = Math.round(difference_ms / ONE_DAY);\n");
            sScript.AppendFormat("arguments.IsValid = (diferencia < {0});\n", RangoFecha);
            sScript.Append("}\n");
            sScript.Append("}\n");
            sScript.Append("</script>\n");

            Page.ClientScript.RegisterClientScriptBlock(Page.GetType(), "ValRango", sScript.ToString());

        }
        //Validar que se respete el rango por el cambio de moneda a "Bolivar Fuerte"
        if (!Page.ClientScript.IsClientScriptBlockRegistered(Page.GetType(), @"RangoPorTipoBolivar"))
        {
            CultureInfo provider = Thread.CurrentThread.CurrentCulture;
            StringBuilder sScript = new StringBuilder();
            string diaLimiteCambioMoneda = ConfigurationManager.AppSettings[@"diaLimiteCambioMonedaBolivarFuerte"];

            sScript.Append("<script language=\"javascript\" type=\"text/javascript\">\n");
            sScript.Append("function ValidarRangoPorTipoBolivar(source, arguments)\n");
            sScript.Append("{\n");
            sScript.AppendFormat("var vFechaDesde = document.getElementById('{0}').value;\n", dtFechaDesde.ClientID);
            sScript.AppendFormat("var vFechaHasta = document.getElementById('{0}').value;\n", dtFechaHasta.ClientID);
            sScript.AppendFormat("var vFechaLimiteMoneda = '{0}'\n", diaLimiteCambioMoneda);

            sScript.Append("if(vFechaDesde && vFechaDesde.length > 0 && vFechaHasta && vFechaHasta.length > 0)\n");
            sScript.Append("{\n");
            sScript.AppendFormat("var aFechaDesde = vFechaDesde.split('{0}');\n", provider.DateTimeFormat.DateSeparator);
            sScript.AppendFormat("var aFechaHasta = vFechaHasta.split('{0}');\n", provider.DateTimeFormat.DateSeparator);
            sScript.AppendFormat("var aFechaLimite = vFechaLimiteMoneda.split('{0}');\n", provider.DateTimeFormat.DateSeparator);

            string sformat = provider.DateTimeFormat.ShortDatePattern;
            if (sformat == @"dd" + provider.DateTimeFormat.DateSeparator + @"MM" + provider.DateTimeFormat.DateSeparator + @"yyyy")
                sScript.Append("var vFD = new Date(Number(aFechaDesde[2]), Number(aFechaDesde[1]) - 1, Number(aFechaDesde[0]));\n");
            else if (sformat == @"MM" + provider.DateTimeFormat.DateSeparator + @"dd" + provider.DateTimeFormat.DateSeparator + @"yyyy")
                sScript.Append("var vFD = new Date(Number(aFechaDesde[2]), Number(aFechaDesde[0]) - 1, Number(aFechaDesde[1]));\n");
            else if (sformat == @"yyyy" + provider.DateTimeFormat.DateSeparator + @"MM" + provider.DateTimeFormat.DateSeparator + "dd")
                sScript.Append("var vFD = new Date(Number(aFechaDesde[0]), Number(aFechaDesde[1]) - 1, Number(aFechaDesde[2]));\n");
            else
                sScript.Append("var vFD = new Date(Number(aFechaDesde[2]), Number(aFechaDesde[0]) - 1, Number(aFechaDesde[1]));\n");
            if (sformat == @"dd" + provider.DateTimeFormat.DateSeparator + @"MM" + provider.DateTimeFormat.DateSeparator + @"yyyy")
                sScript.Append("var vFH = new Date(Number(aFechaHasta[2]), Number(aFechaHasta[1]) - 1, Number(aFechaHasta[0]));\n");
            else if (sformat == @"MM" + provider.DateTimeFormat.DateSeparator + @"dd" + provider.DateTimeFormat.DateSeparator + @"yyyy")
                sScript.Append("var vFH = new Date(Number(aFechaHasta[2]), Number(aFechaHasta[0]) - 1, Number(aFechaHasta[1]));\n");
            else if (sformat == @"yyyy" + provider.DateTimeFormat.DateSeparator + @"MM" + provider.DateTimeFormat.DateSeparator + "dd")
                sScript.Append("var vFH = new Date(Number(aFechaHasta[0]), Number(aFechaHasta[1]) - 1, Number(aFechaHasta[2]));\n");
            else
                sScript.Append("vFH = new Date(Number(aFechaHasta[2]), Number(aFechaHasta[0]) - 1, Number(aFechaHasta[1]));\n");

            if (sformat == @"dd" + provider.DateTimeFormat.DateSeparator + @"MM" + provider.DateTimeFormat.DateSeparator + @"yyyy")
                sScript.Append("var vFL = new Date(Number(aFechaLimite[2]), Number(aFechaLimite[1]) - 1, Number(aFechaLimite[0]));\n");
            else if (sformat == @"MM" + provider.DateTimeFormat.DateSeparator + @"dd" + provider.DateTimeFormat.DateSeparator + @"yyyy")
                sScript.Append("var vFL = new Date(Number(aFechaLimite[2]), Number(aFechaLimite[0]) - 1, Number(aFechaLimite[1]));\n");
            else if (sformat == @"yyyy" + provider.DateTimeFormat.DateSeparator + @"MM" + provider.DateTimeFormat.DateSeparator + "dd")
                sScript.Append("var vFL = new Date(Number(aFechaLimite[0]), Number(aFechaLimite[1]) - 1, Number(aFechaLimite[2]));\n");
            else
                sScript.Append("vFL = new Date(Number(aFechaLimite[2]), Number(aFechaLimite[0]) - 1, Number(aFechaLimite[1]));\n");

            sScript.Append("if((vFD < vFL) && (vFH >= vFL))\n");
            sScript.Append("arguments.IsValid = false;\n");
            sScript.Append("}\n");
            sScript.Append("}\n");
            sScript.Append("</script>\n");
            Page.ClientScript.RegisterClientScriptBlock(Page.GetType(), @"RangoPorTipoBolivar", sScript.ToString());
        }
        AgregarJs(@"dw_event", @"../Scripts/dw_event.js");
        AgregarJs(@"dw_viewport", @"../Scripts/dw_viewport.js");
        AgregarJs(@"dw_tooltip", @"../Scripts/dw_tooltip.js");

        if (!Page.ClientScript.IsStartupScriptRegistered(@"ITT"))
            Page.ClientScript.RegisterStartupScript(Page.GetType(), @"ITT", @"Tooltip.init();", true);
    }
}